package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

// createDirectoryStructure 创建目录结构
func createDirectoryStructure() {
	fmt.Println("开始生成 Learn Pascal by Example 网站结构...")

	// 创建主目录
	dirs := []string{"content", "templates", "static/css"}
	for _, dir := range dirs {
		if err := createDirectory(dir); err != nil {
			fmt.Printf("创建目录失败 %s: %v\n", dir, err)
		}
	}

	// 创建CSS文件（如果不存在）
	cssFile := "static/css/style.css"
	if !fileExists(cssFile) {
		// 创建一个空的CSS文件，内容将从单独的CSS文件中读取
		if err := createFile(cssFile, ""); err != nil {
			fmt.Printf("创建CSS文件失败: %v\n", err)
		} else {
			fmt.Printf("创建文件: %s\n", cssFile)
		}
	}
}

// generateExampleContent 生成示例内容（仅当示例不存在时）
func generateExampleContent(examples []Example) {
	for _, example := range examples {
		exampleDir := filepath.Join("content", example.Directory)

		// 检查示例目录是否存在
		if _, err := os.Stat(exampleDir); err == nil {
			// 目录已存在，检查是否包含必要的文件
			pasFile := filepath.Join(exampleDir, "example.pas")
			descFile := filepath.Join(exampleDir, "description.txt")
			outputFile := filepath.Join(exampleDir, "output.txt")

			// 如果所有文件都存在，则跳过该示例
			if fileExists(pasFile) && fileExists(descFile) && fileExists(outputFile) {
				fmt.Printf("示例已存在，跳过: %s\n", exampleDir)
				continue
			}
		}

		// 创建示例目录
		if err := createDirectory(exampleDir); err != nil {
			fmt.Printf("创建示例目录失败 %s: %v\n", exampleDir, err)
			continue
		}

		// 创建合法的 Pascal 程序名称（不能以数字开头）
		programName := strings.ReplaceAll(example.Directory, "-", "_")
		if strings.HasPrefix(programName, "0") {
			// 移除前导零，添加前缀确保合法
			programName = "p_" + strings.TrimLeft(programName, "0")
		}

		// 创建示例Pascal文件
		pasContent := fmt.Sprintf(`// %s (%s) 示例
program %s;

{$mode objfpc}{$H+}

uses
  SysUtils;

begin
  WriteLn('这是 %s 示例');
  ReadLn;
end.
`, example.Title, example.ChineseTitle, programName, example.Title)

		pasFile := filepath.Join(exampleDir, "example.pas")
		if err := createFile(pasFile, pasContent); err != nil {
			fmt.Printf("创建示例文件失败 %s: %v\n", pasFile, err)
		}

		// 创建描述文件
		descContent := fmt.Sprintf(`# %s (%s)

在此处添加关于 %s 的详细说明。

## 概念介绍

在这里描述该主题的基本概念和用途。

## 代码解析

逐行解释示例代码的关键部分。

## 相关资源

- [官方文档]()
`, example.Title, example.ChineseTitle, example.Title)

		descFile := filepath.Join(exampleDir, "description.txt")
		if err := createFile(descFile, descContent); err != nil {
			fmt.Printf("创建描述文件失败 %s: %v\n", descFile, err)
		}

		// 创建输出文件
		outputContent := fmt.Sprintf("这是 %s 示例的预期输出结果", example.Title)
		outputFile := filepath.Join(exampleDir, "output.txt")
		if err := createFile(outputFile, outputContent); err != nil {
			fmt.Printf("创建输出文件失败 %s: %v\n", outputFile, err)
		}

		fmt.Printf("创建示例内容: %s\n", exampleDir)
	}
}

// fileExists 检查文件是否存在
func fileExists(filename string) bool {
	_, err := os.Stat(filename)
	return !os.IsNotExist(err)
}